// 类中属性。
class A {
    // 原始写法。
    constructor() {
        this.xxx = 'value';
    }

    // 现代写法。
    yyy = 'value'
}

// 实体。
class Person {
    // 普通实例对象中的属性。
    prop1 = '123'

    name = '大烧猪'

    // 静态属性。
    static callName = '人';

    // 定义一个静态属性。
    static isSmart = false;

    // 如：在我自己的函数中拿到静态属性。写法：直接拿着这个类名取访问。
    speech() {
        console.log(`我是${Person.callName}，那我就应该很${Person.isSmart ? '聪明' : 2}`);
    }

    // 静态方法。 如何的到人的移动行为？
    static move() {
        console.log('人类直立行走！');
    }

    // getter 读属性：基于 callName 前面拼凑一个 '亲爱的'。
    // 使用方式如同有返回值的函数，只是不用调用，而是去点出。
    // 控制访问
    get respectName() {
        return '亲爱的' + this.name;
    }

    // setter 写属性：名字只能改成有姓有名，至少2个字。
    // 控制访问
    set respectName(value) {
        value.length > 1 && value.length < 7 && (this.name = value);
    }

    get lastName() {
        return '彭'
    }

    likes = {
        food: ['方便面', '泡面', '拉面', '干拌面', '泡米线', '泡米粉']
    }

    get like() {
        console.log('GETTER');
        return this.likes;
    }

    set like(value) {
        console.log('SETTER');
        this.likes = value
    }

    // 静态 getter
    static get smart() {
        return Person.isSmart ? '聪明' : '中二'
    }

    // 静态 setter
    static set smart(value) {
        // vlaue: 聪明 绝顶 | 中二 笨 .........
        Person.isSmart = ['聪明', '绝顶'].some(i => i === value);
    }
}

const b = new Person();

b.prop1;

Person.smart = '绝顶';

b.speech();

Person.move();


b.respectName = '超级无敌宇宙大烧猪';

console.log(b.respectName);

console.log(Person.smart);

b.lastName = '刘';

console.dir(b);

console.log(b.lastName);



b.like.food = ['Coke', 'Pepsi']

console.log(b.like);